home *** CD-ROM | disk | FTP | other *** search
- /*
- File: PrefsFile.cpp
-
- Contains: xxx put contents here xxx
-
- Owned by: Nick Pilch
-
- Copyright: © 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <7> 02.07.1996 NP 1363969: No existing prefs file causes
- crash.
- <6> 6/28/96 TJ Fixed Non-Debug Build.
- <5> 6/27/96 NP 10002: Launch time speedups.
- <4> 6/26/96 NP 10002: Launch time speedups.
- <3> 6/24/96 NP 10002: Launch time speedups
- <2> 6/23/96 NP 10002: Launch time speedups.
- <1> 6/21/96 NP first checked in
-
- To Do:
- */
-
- #ifndef ODMEMORYCP_H
- #include "ODMemoryCP.h"
- #endif
-
- #ifndef PREFSFILE_H
- #include "PrefsFile.h"
- #endif
-
- #ifndef ST_MACCLASSES_H
- #include "ST_MacClasses.h"
- #endif
-
- #ifndef BETTERFINDFOLDER_H
- #include "BetterFindFolder.h"
- #endif
-
- #ifndef SIZERC_H
- #include "SIZERC.h"
- #endif
-
- #ifndef _PROCESSSTUFF_
- #include "ProcessStuff.h"
- #endif
-
- #ifndef _SHELLDEF_
- #include "ShellDef.h"
- #endif
-
- #ifndef _ODPRCS_
- #include "ODPrcs.h"
- #endif
-
- #ifndef __FOLDERS__
- #include "Folders.h"
- #endif
-
- #ifndef __FINDER__
- #include "Finder.h"
- #endif
-
- #ifndef __TEXTUTILS__
- #include "TextUtils.h"
- #endif
-
- #ifndef __DIALOGS__
- #include "Dialogs.h"
- #endif
-
- #ifndef __ALIASES__
- #include "Aliases.h"
- #endif
-
-
- #define kOpenDocPreferencesFolderType 'ODPF'
- #define kCompactPrefsFileResType 'FILE'
- #define kCompactPrefsFileResID 128
- //#define kDefaultSizeResourceType 'DSIZ'
- #define kDefaultSizeResourceID 128
-
- inline StringHandle GETSTRING(short resID)
- {
- #if ODDebug
- StringHandle h = GetString(resID);
- if (!h)
- DebugStr("\pGetString failed. I suggest 'es' now.");
- return h;
- #else
- return GetString(resID);
- #endif
- }
-
- inline void GETINDSTRING(StringPtr string, short resID, short index)
- {
- GetIndString(string, resID, index);
- #if ODDebug
- if (!string[0])
- DebugStr("\pGetIndString returned a NULL string. Is this right?");
- #endif
- }
-
- //------------------------------------------------------------------------------
- // CreateODPrefsFile
- //
- // I believe it is not necessary to put anything in the data fork of a newly
- // created OpenDoc prefs file. I think the OpenDoc code can handle it. Also, it
- // probably just writes over whatever is in there when it saves the preferences
- // from Editor Setup.
- //------------------------------------------------------------------------------
-
- static OSErr CreateODPrefsFile (short vRefNum, long dirID, Str255 fileName)
- {
- /* load the compact file resource */
- ST_ResourceHandle compactFile = Get1Resource (kCompactPrefsFileResType, kCompactPrefsFileResID);
- if ((Handle)compactFile == NULL)
- return resNotFound;
-
- HLock ((Handle) compactFile);
-
- /* create the file on disk, setting correct type and creator */
- CInfoPBRec pb;
- BlockMoveData (*(Handle) compactFile, &pb, sizeof (pb));
-
- OSErr error = HCreate (vRefNum, dirID, fileName, pb.hFileInfo.ioFlFndrInfo.fdCreator,
- pb.hFileInfo.ioFlFndrInfo.fdType);
- if (error)
- return error;
-
- /* write the contents of the file */
- short tempRef;
- error = HOpenRF (vRefNum, dirID, fileName, fsRdWrPerm, &tempRef);
- if (error)
- return error;
-
- {
- ST_FileCloser fileRef = tempRef;
- long count = pb.hFileInfo.ioFlRLgLen;
- error = FSWrite (fileRef, &count, (*(Handle) compactFile) + sizeof (pb));
- if (error)
- return error;
- }
-
- /* set file information */
-
- CInfoPBRec getInfoPB;
- BlockMoveData (&pb, &getInfoPB, sizeof (getInfoPB));
-
- getInfoPB.hFileInfo.ioNamePtr = fileName;
- getInfoPB.hFileInfo.ioVRefNum = vRefNum;
- getInfoPB.hFileInfo.ioDirID = dirID;
- getInfoPB.hFileInfo.ioFDirIndex = 0;
-
- error = PBGetCatInfoSync (&getInfoPB);
- if (error)
- return error;
-
- /* copy relevant info */
- CInfoPBRec setInfoPB;
- BlockMoveData (&getInfoPB, &setInfoPB, sizeof (setInfoPB));
-
- setInfoPB.hFileInfo.ioFlFndrInfo.fdFlags &= ~0x0100; /* clear inited flag */
- setInfoPB.hFileInfo.ioDirID = dirID;
-
- error = PBSetCatInfoSync (&setInfoPB);
- if (error)
- return error;
-
- return noErr;
- }
-
- //------------------------------------------------------------------------------
- // OpenODPrefsResFile
- //------------------------------------------------------------------------------
-
- short OpenODPrefsResFile (Boolean createIt, short permissions)
- {
- short vRefNum;
- long dirID;
- Str255 fileName;
-
- OSErr error = BetterFindFolder (kOnSystemDisk, kOpenDocPreferencesFolderType,
- createIt, &vRefNum, &dirID);
- if (error)
- return error;
-
- GETINDSTRING (fileName, kMiscStrings, kODPrefsNameStr);
-
- /* No harm done if this fails. If it succeeds, we've created a file to open */
- if (createIt)
- CreateODPrefsFile (vRefNum, dirID, fileName);
-
- return HOpenResFile (vRefNum, dirID, fileName, permissions);
- }
- #if 0
- //------------------------------------------------------------------------------
- // OpenODPrefsResFile
- //------------------------------------------------------------------------------
-
- short OpenODPrefsResFile (Boolean createIt, short permissions)
- {
-
- }
- #endif /* 0 */
- //------------------------------------------------------------------------------
- // GetDefaultSIZEResource
- //------------------------------------------------------------------------------
-
- static SIZEResourceHandle GetDefaultSIZEResource (short resFile)
- {
- ST_ResFileSaver saver = CurResFile ();
- UseResFile (resFile);
-
- SIZEResourceHandle s = (SIZEResourceHandle) Get1Resource ('SIZE', kOriginalSIZEResourceID);
- if (!s) {
- Handle defaultSIZEResource = GetResource ('SIZE', kDocStubSIZEID);
- if (!defaultSIZEResource)
- return nil;
- DetachResource (defaultSIZEResource);
- AddResource (defaultSIZEResource, 'SIZE', kOriginalSIZEResourceID, "\p");
- if (ResError ()) {
- DisposeHandle (defaultSIZEResource);
- return nil;
- } else {
- WriteResource (defaultSIZEResource);
- return (SIZEResourceHandle) defaultSIZEResource;
- }
- } else
- return s;
- }
-
- //------------------------------------------------------------------------------
- // SetODDefaultSize
- //------------------------------------------------------------------------------
-
- OSErr SetODDefaultSize (short resFile, Size defaultSize)
- {
- SIZEResourceHandle s = GetDefaultSIZEResource (resFile);
- if (s) {
- (**s).preferredMemorySize = defaultSize;
- // Probably should return the errors received from these calls.
- ChangedResource ((Handle) s);
- WriteResource ((Handle) s);
- ReleaseResource ((Handle) s);
- return noErr;
- } else {
- return resNotFound;
- }
- }
-
- //------------------------------------------------------------------------------
- // GetODDefaultSize
- //------------------------------------------------------------------------------
-
- OSErr GetODDefaultSize (short resFile, Size &defaultSize)
- {
- SIZEResourceHandle s = GetDefaultSIZEResource (resFile);
-
- if (s) {
- defaultSize = (**s).preferredMemorySize;
- ReleaseResource ((Handle)s);
- return noErr;
- } else
- defaultSize = kDocStubDefaultSize;
-
- return noErr;
- // return resNotFound;
- }
-
- //------------------------------------------------------------------------------
- // AliasSystemProcessToStartupFolder
- //
- // Modified from Stickies.
- //------------------------------------------------------------------------------
-
- Boolean AliasSystemProcessToStartupFolder()
- {
- FSSpec sysProcSpec;
- OSErr error;
- FSSpec aliasSpec;
- FInfo finderInfo;
-
- // DELETE OUR FILE IF IT EXISTS. IGNORE ERROR HERE. WE'LL CATCH IT DOWN
- // BELOW
- if (OurAliasFileIsInStartupFolder(&aliasSpec))
- FSpDelete(&aliasSpec);
-
- error = SystemProcessFileSpecFromName(&sysProcSpec);
-
- // verify existence
- if (!error)
- error = FSpGetFInfo(&sysProcSpec, &finderInfo);
-
- // try again
- if (error)
- error = SystemProcessFileSpecFromSecretResource(&sysProcSpec);
-
- if (error)
- StopAlert(kCantFindTheSystemProcess, NULL);
- else
- {
- error = FindFolder(kOnSystemDisk, kStartupFolderType, kCreateFolder,
- &aliasSpec.vRefNum, &aliasSpec.parID);
- if (!error)
- {
- CopyPascalString(aliasSpec.name,
- *GETSTRING(kSHLSystemProcessNameResID));
- FSpCreateResFile(&aliasSpec, kODSystemProcessSignature,
- kApplicationAliasType, smSystemScript);
- if (!ResError())
- {
- FInfo info;
-
- error = FSpGetFInfo(&aliasSpec,&info);
- if (!error)
- {
- info.fdFlags |= kIsAlias;
- error = FSpSetFInfo(&aliasSpec,&info);
- }
- if (!error)
- {
- short refNum;
-
- refNum = FSpOpenResFile(&aliasSpec, fsRdWrPerm);
- if (refNum != -1)
- {
- AliasHandle alias;
-
- error = NewAlias(&aliasSpec, &sysProcSpec, &alias);
- if (!error)
- {
- AddResource((Handle)alias, rAliasType, 0,
- aliasSpec.name);
- error = ResError();
- if (error)
- DisposeHandle((Handle)alias);
- }
- }
- CloseResFile(refNum);
- }
- if (error)
- FSpDelete(&aliasSpec);
- }
- else
- error = dupFNErr;
- }
- if (error)
- StopAlert(kCouldntCreateAliasInStartupFolder, NULL);
- }
-
- if (!error)
- FlushVol(NULL, aliasSpec.vRefNum);
-
- return error ? false : true;
- }
-
- //------------------------------------------------------------------------------
- // RemoveAliasToSystemProcessFromStartupFolder
- //------------------------------------------------------------------------------
-
- Boolean RemoveAliasToSystemProcessFromStartupFolder()
- {
- OSErr error = noErr;
- Boolean result = false;
- FSSpec aliasSpec;
-
- if (OurAliasFileIsInStartupFolder(&aliasSpec))
- error = FSpDelete(&aliasSpec);
-
- if (error)
- StopAlert(kCouldntRemoveAliasFromStartupFolder, NULL);
-
- return error ? false : true;
- }
-
- //------------------------------------------------------------------------------
- // OurAliasFileIsInStartupFolder
- //
- // Returns FSSpec to alias file in aliasSpec
- //------------------------------------------------------------------------------
-
- Boolean OurAliasFileIsInStartupFolder(FSSpec* aliasSpec)
- {
- OSErr error;
- FInfo finderInfo;
-
- error = FindFolder(kOnSystemDisk, kStartupFolderType, kCreateFolder,
- &aliasSpec->vRefNum, &aliasSpec->parID);
- if (!error)
- {
- CopyPascalString(aliasSpec->name,
- *GETSTRING(kSHLSystemProcessNameResID));
- error = FSpGetFInfo(aliasSpec, &finderInfo);
- if (!(finderInfo.fdFlags & kIsAlias))
- error = fnfErr;
- }
-
- return error ? false : true;
- }
-
-